home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / aint86.asm < prev    next >
Assembly Source File  |  1991-08-15  |  4KB  |  121 lines

  1. ; File......: AINT86.ASM
  2. ; Author....: Ted Means
  3. ; Date......: $Date:   15 Aug 1991 23:07:24  $
  4. ; Revision..: $Revision:   1.1  $
  5. ; Log file..: $Logfile:   E:/nanfor/src/aint86.asv  $
  6. ; This is an original work by Ted Means and is placed in the
  7. ; public domain.
  8. ;
  9. ; Modification history:
  10. ; ---------------------
  11. ;
  12. ; $Log:   E:/nanfor/src/aint86.asv  $
  13. ;  
  14. ;     Rev 1.1   15 Aug 1991 23:07:24   GLENN
  15. ;  Forest Belt proofread/edited/cleaned up doc
  16. ;  
  17. ;     Rev 1.0   27 May 1991 13:21:48   GLENN
  18. ;  Initial revision.
  19. ;
  20.  
  21.  
  22. ; This file is a part of the ft_int86() package.  For complete
  23. ; documentation, read cint86.c, available elsewhere in the 
  24. ; Nanforum Toolkit.
  25. ;
  26. ; This module should be compiled with TASM.
  27.  
  28.  
  29. Public   __ftint86
  30.  
  31. Segment  _NanFor   Word      Public    "CODE"
  32.          Assume    CS:_NanFor
  33.  
  34. Proc     __ftint86 Far
  35.  
  36.          Pop       CX                        ; Remove return address from
  37.          Pop       DX                        ; stack
  38.  
  39.          Pop       [CS:RegOfs]               ; Get pointer to register
  40.          Pop       [CS:RegSeg]               ; structure from stack
  41.  
  42.          Pop       AX                        ; Get desired interrupt
  43.  
  44.          Push      DX                        ; Put return address back onto
  45.          Push      CX                        ; stack to prevent underflow
  46.  
  47.          Push      DS                        ; Save modified registers
  48.          Push      SI
  49.          Push      DI
  50.          Push      BP
  51.  
  52.          Mov       AH,35h                    ; DOS service -- get vector
  53.          Int       21h                       ; Call DOS
  54.          Mov       [CS:HndSeg],ES            ; Store address of desired
  55.          Mov       [CS:HndOfs],BX            ; interrupt handler
  56.  
  57.          LDS       BX,[CS:RegPtr]            ; Load pointer to register values
  58.          Push      [Word Ptr BX + 16]        ; Put ES value on stack
  59.          Push      [Word Ptr BX + 14]        ; Put DS value on stack
  60.          Push      [Word Ptr BX + 12]        ; Put BP value on stack
  61.          Push      [Word Ptr BX + 10]        ; Put DI value on stack
  62.          Push      [Word Ptr BX + 8]         ; Put SI value on stack
  63.          Push      [Word Ptr BX + 6]         ; Put DX value on stack
  64.          Push      [Word Ptr BX + 4]         ; Put CX value on stack
  65.          Push      [Word Ptr BX + 2]         ; Put BX value on stack
  66.          Mov       AX,[Word Ptr BX + 0]      ; Get AX value
  67.          Pop       BX                        ; Get BX value
  68.          Pop       CX                        ; Get CX value
  69.          Pop       DX                        ; Get DX value
  70.          Pop       SI                        ; Get SI value
  71.          Pop       DI                        ; Get DI value
  72.          Pop       BP                        ; Get BP value
  73.          Pop       DS                        ; Get DS value
  74.          Pop       ES                        ; Get ES value
  75.  
  76.          PushF                               ; Simulate INT instruction by
  77.          CLI                                 ; using PushF and CLI
  78.          Call      [CS:Handler]              ; Call the interrupt handler
  79.  
  80.          Push      AX                        ; Save all registers to preserve
  81.          Push      BX                        ; the state of the CPU after
  82.          Push      CX                        ; the interrupt executed
  83.          Push      DX
  84.          Push      SI
  85.          Push      DI
  86.          Push      BP
  87.          Push      DS
  88.          Push      ES
  89.          PushF
  90.  
  91.          LDS       BX,[CS:RegPtr]            ; Load pointer to register values
  92.          Pop       [Word Ptr BX + 18]        ; Get saved registers and load
  93.          Pop       [Word Ptr BX + 16]        ; into data structure
  94.          Pop       [Word Ptr BX + 14]
  95.          Pop       [Word Ptr BX + 12]
  96.          Pop       [Word Ptr BX + 10]
  97.          Pop       [Word Ptr BX + 8]
  98.          Pop       [Word Ptr BX + 6]
  99.          Pop       [Word Ptr BX + 4]
  100.          Pop       [Word Ptr BX + 2]
  101.          Pop       [Word Ptr BX + 0]
  102.  
  103.          Pop       BP                        ; Restore registers
  104.          Pop       DI
  105.          Pop       SI
  106.          Pop       DS
  107.          Ret
  108. Endp     __ftint86
  109.  
  110. Label    Handler   DWord
  111. HndOfs   DW        ?
  112. HndSeg   DW        ?
  113.  
  114. Label    RegPtr    DWord
  115. RegOfs   DW        ?
  116. RegSeg   DW        ?
  117.  
  118. Ends     _NanFor
  119. End
  120.